package com.defangit.production.bll;

import com.defangit.production.domain.ProcessTime;
import com.defangit.production.domain.ProductionProcess;
import com.defangit.production.domain.TimeSheet;
import laogen.util.entities.Finder;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 工时记录业务逻辑类
 */
public interface TimeSheetBll {
    /**
     * 开始工时记录
     * @param userId 工时记录涉及的员工id
     * @param processId 工时记录涉及的工序id
     * @return 增加的工时记录
     */
    TimeSheet beginTimeSheet(int userId,int processId);
    TimeSheet beginTimeSheet(int userId);

    /**
     * 结束工时记录
     * @param userId 工时记录涉及的员工id
     * @return 是否成功结束工时记录
     */
    boolean endTimeSheet(int userId);
    boolean endTimeSheet(int userId, List<ProcessTime> processTimes);

    /**
     * 补录工时记录
     * @param sheet 要补录的工时记录
     * @return 是否成功补录工时记录
     */
    boolean makeUpTimeSheet(TimeSheet sheet);
    /**
     * 修改工时记录涉及的用户
     * @param timeSheetId 要修改的工时记录id
     * @param userId 工时记录目标用户id
     * @return 是否成功修改工时记录用户
     */
    boolean changeUser(int timeSheetId,int userId);

    /**
     * 更改工时记录涉及的工序
     * @param timeSheetId 要修改的工时记录id
     * @param productionProcessId 工时记录涉及的工序id
     * @return 是否成功修改工时记录涉及的工序
     */
    boolean changeProcess(int timeSheetId,int productionProcessId);

    /**
     * 更改工时记录
     * @param sheet 要修改的工时记录
     * @return 是否成功更改工时记录
     */
    boolean changeTimeSheet(TimeSheet sheet);
    /**
     * 删除目标工时记录
     * @param sheetId 要删除的工时记录id
     * @return 是否成功删除工时记录
     */
    boolean deleteTimeSheet(int sheetId);

    /**
     * 查找已签到工时记录
     * @param operatorId 签到用户id
     * @return 用户已签到的工时记录
     */
    TimeSheet signed(int operatorId);
    TimeSheetFinder findAll();

    interface TimeSheetFinder extends Finder<TimeSheet> {
        /**
         * 根据用户id区分工时记录查询
         * @param userId 要查询的用户id
         * @return 区分用户后的工时记录查询
         */
        TimeSheetFinder user(Integer userId);

        /**
         * 根据工序id区分工时记录查询
         * @param processId 要查询的产品工序id
         * @return 区分工序后的工时记录查询
         */
        TimeSheetFinder process(Integer processId);

        /**
         * 根据产品订单id区分工时记录查询
         * @param billId 要查询的产品订单id
         * @return 区分产品订单后的工时记录查询
         */
        TimeSheetFinder bill(Integer billId);

        /**
         * 工序工时记录起止时间区分工时记录查询
         * @param startTime 要查询的工时记录起始时间
         * @param endTime 要查询的工时记录结束时间
         * @return 区分起止时间后的工时记录查询
         */
        TimeSheetFinder timeBetween(LocalDateTime startTime,LocalDateTime endTime);

        /**
         * 根据完成状态区分工时记录查询
         * @param isDone 要查询的工时记录是否已完成
         * @return 区分完成状态后的工时记录查询
         */
        TimeSheetFinder done(Boolean isDone);

        /**
         *按照id倒序排列
         * */
        TimeSheetFinder idDesc();

        /**
         * 根据开启时间查询签到表
         * */
        TimeSheetFinder startTimeBetween(LocalDateTime min,LocalDateTime max);
    }
}
